package com.ksyun.ks3.demo;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.Date;

import com.ksyun.ks3.dto.AccessControlList;
import com.ksyun.ks3.dto.CannedAccessControlList;
import com.ksyun.ks3.dto.Grant;
import com.ksyun.ks3.dto.GranteeId;
import com.ksyun.ks3.dto.ObjectMetadata;
import com.ksyun.ks3.dto.Permission;
import com.ksyun.ks3.service.request.PutObjectRequest;

/**
 * @author lijunwei[lijunwei@kingsoft.com]  
 * 
 * @date 2014年12月1日 下午2:08:11
 * 
 * @description 上传文件示例
 **/
public class PutObjectDemo extends AbstractDemo {
	/**
	 * 将new File("filePath")这个文件上传至test.bucket这个存储空间下，并命名为test/object.rar
	 */
	public void putObjectWithFile() {
		PutObjectRequest request = new PutObjectRequest("test.bucket",
				"test/object.rar", new File("filePath"));
		// 设置将要上传的object为公开读的
		request.setCannedAcl(CannedAccessControlList.PublicRead);

		ObjectMetadata meta = new ObjectMetadata();
		// 设置将要上传的object的用户元数据
		meta.setUserMeta("x-kss-meta-example", "example");
		// 设置将要上传的object的元数据
		meta.setContentType("text/html");
		meta.setContentEncoding("gzip");
		meta.setCacheControl("no-cache");
		meta.setHttpExpiresDate(new Date());
		meta.setContentDisposition("attachment; filename=fname.ext");

		request.setObjectMeta(meta);

		client.putObject(request);
	}

	public void putObjectWithInputStream() {
		ObjectMetadata meta = new ObjectMetadata();
		// 设置将要上传的object的用户元数据
		meta.setUserMeta("x-kss-meta-example", "example");
		// 设置将要上传的object的元数据
		meta.setContentType("text/html");
		meta.setContentEncoding("gzip");
		meta.setCacheControl("no-cache");
		meta.setHttpExpiresDate(new Date());
		meta.setContentDisposition("attachment; filename=fname.ext");

		PutObjectRequest request = new PutObjectRequest("ksc-scm",
				"test/object.txt", new ByteArrayInputStream("1234".getBytes()),
				meta);

		// 可以指定内容的长度，否则程序会把整个输入流缓存起来，可能导致jvm内存溢出
		meta.setContentLength(4);
		// 可以指定内容的md5摘要，程序将在ks3服务端进行md5值校验，否则程序只会在客户端进行md5值校验(以下内容只是示例，不能保证正确，请用户自行计算)
		meta.setContentMD5("gdyb21LQTcIANtvYMT7QVQ==");

		AccessControlList acl = new AccessControlList();
		// 设置用户id为12345678的用户对object的读权限
		Grant grant1 = new Grant();
		grant1.setGrantee(new GranteeId("12345678"));
		grant1.setPermission(Permission.Read);
		acl.addGrant(grant1);
		// 设置用户id为123456789的用户对object完全控制
		Grant grant2 = new Grant();
		grant2.setGrantee(new GranteeId("123456789"));
		grant2.setPermission(Permission.FullControl);
		acl.addGrant(grant2);

		// 设置acl
		request.setAcl(acl);

		client.putObject(request);
	}
}
